// 创建 NodeBuilder 实例
def builder = new NodeBuilder()

def date1 = Date.parse('yyyy-MM-dd', '2015-01-01')
def date2 = Date.parse('yyyy-MM-dd', '2015-02-02')


// invoices 方法是假装方法, 生成器拦截这个方法然后生成同名的根节点.
// BuilderSupport(NodeBuilder 的父类) 把作为参数的闭包的 delegate 设置为 NodeBuilder 
// 的实例
def invoices = builder.invoices {
	// invoice 方法被传播给 NodeBuilder 实例, 因为 闭包的 delegate 现在是它
	// 闭包中调用 invoice 假装方法, 生成子节点 invoice
	invoice(date: date1) {
		item(count: 5) {
			product(name: 'ULC', doller: 1499)
		}
		item(count: 1) {
			product(name: 'Visual Editor', doller: 499)
		}
	}
	invoice(date: date2) {
		item(count: 4) {
			product(name: 'Visual Editor', doller: 499)
		}
	}
}

def soldAt = invoices.grep {
	// product 在这里视为节点, 所以 it.@name 相当于 map.@key; @ 不能省略!
	// @ 用来指明是节点的属性访问
	it.item.product.any { it.@name == 'ULC' }
	// 注意这里 '@date' 如果不加单引号, 那就是求 ArrayList 的 date 字段了!!!
}.'@date'

println soldAt
